(function($){
        $.fn.extend({
            tableExport: function(options) {
                var defaults = {
      separator: ',',
      ignoreColumn: [],
      tableName:'yourTableName',
      type:'csv',
      pdfFontSize:14,
      pdfLeftMargin:20,
      escape:'true',
      htmlContent:'false',
      consoleLog:'false'
    };
                 
    var options = $.extend(defaults, options);
    var el = this;
     
    if(defaults.type == 'csv' || defaults.type == 'txt'){
     
     // Header
     var tdData ="";
     $(el).find('thead').find('tr').each(function() {
     tdData += "\n";     
      $(this).filter(':visible').find('th').each(function(index,data) {
       if ($(this).css('display') != 'none'){
        if(defaults.ignoreColumn.indexOf(index) == -1){
         tdData += '"' + parseString($(this)) + '"' + defaults.separator;         
        }
       }
        
      });
      tdData = $.trim(tdData);
      tdData = $.trim(tdData).substring(0, tdData.length -1);
     });
      
     // Row vs Column
     $(el).find('tbody').find('tr').each(function() {
     tdData += "\n";
      $(this).filter(':visible').find('td').each(function(index,data) {
       if ($(this).css('display') != 'none'){
        if(defaults.ignoreColumn.indexOf(index) == -1){
         tdData += '"'+ parseString($(this)) + '"'+ defaults.separator;
        }
       }
      });
      //tdData = $.trim(tdData);
      tdData = $.trim(tdData).substring(0, tdData.length -1);
     });
      
     //output
     if(defaults.consoleLog == 'true'){
      console.log(tdData);
     }
     var base64data = "base64," + $.base64.encode(tdData);
     window.open('data:application/'+defaults.type+';filename=exportData;' + base64data);
    }else if(defaults.type == 'sql'){
     
     // Header
     var tdData ="INSERT INTO `"+defaults.tableName+"` (";
     $(el).find('thead').find('tr').each(function() {
      
      $(this).filter(':visible').find('th').each(function(index,data) {
       if ($(this).css('display') != 'none'){
        if(defaults.ignoreColumn.indexOf(index) == -1){
         tdData += '`' + parseString($(this)) + '`,' ;         
        }
       }
        
      });
      tdData = $.trim(tdData);
      tdData = $.trim(tdData).substring(0, tdData.length -1);
     });
     tdData += ") VALUES ";
     // Row vs Column
     $(el).find('tbody').find('tr').each(function() {
     tdData += "(";
      $(this).filter(':visible').find('td').each(function(index,data) {
       if ($(this).css('display') != 'none'){
        if(defaults.ignoreColumn.indexOf(index) == -1){
         tdData += '"'+ parseString($(this)) + '",';
        }
       }
      });
       
      tdData = $.trim(tdData).substring(0, tdData.length -1);
      tdData += "),";
     });
     tdData = $.trim(tdData).substring(0, tdData.length -1);
     tdData += ";";
      
     //output
     //console.log(tdData);
      
     if(defaults.consoleLog == 'true'){
      console.log(tdData);
     }
      
     var base64data = "base64," + $.base64.encode(tdData);
     window.open('data:application/sql;filename=exportData;' + base64data);
      
     
    }else if(defaults.type == 'json'){
     
     var jsonHeaderArray = [];
     $(el).find('thead').find('tr').each(function() {
      var tdData =""; 
      var jsonArrayTd = [];
      
      $(this).filter(':visible').find('th').each(function(index,data) {
       if ($(this).css('display') != 'none'){
        if(defaults.ignoreColumn.indexOf(index) == -1){
         jsonArrayTd.push(parseString($(this)));         
        }
       }
      });         
      jsonHeaderArray.push(jsonArrayTd);      
       
     });
      
     var jsonArray = [];
     $(el).find('tbody').find('tr').each(function() {
      var tdData =""; 
      var jsonArrayTd = [];
      
      $(this).filter(':visible').find('td').each(function(index,data) {
       if ($(this).css('display') != 'none'){
        if(defaults.ignoreColumn.indexOf(index) == -1){
         jsonArrayTd.push(parseString($(this)));         
        }
       }
      });         
      jsonArray.push(jsonArrayTd);         
       
     });
      
     var jsonExportArray =[];
     jsonExportArray.push({header:jsonHeaderArray,data:jsonArray});
      
     //Return as JSON
     //console.log(JSON.stringify(jsonExportArray));
      
     //Return as Array
     //console.log(jsonExportArray);
     if(defaults.consoleLog == 'true'){
      console.log(JSON.stringify(jsonExportArray));
     }
     var base64data = "base64," + $.base64.encode(JSON.stringify(jsonExportArray));
     window.open('data:application/json;filename=exportData;' + base64data);
    }else if(defaults.type == 'xml'){
     
     var xml = '<?xml version="1.0" encoding="utf-8"?>';
     xml += '<tabledata><fields>';
     // Header
     $(el).find('thead').find('tr').each(function() {
      $(this).filter(':visible').find('th').each(function(index,data) {
       if ($(this).css('display') != 'none'){     
        if(defaults.ignoreColumn.indexOf(index) == -1){
         xml += "<field>" + parseString($(this)) + "</field>";
        }
       }
      });         
     });     
     xml += '</fields><data>';
      
     // Row Vs Column
     var rowCount=1;
     $(el).find('tbody').find('tr').each(function() {
      xml += '<row id="'+rowCount+'">';
      var colCount=0;
      $(this).filter(':visible').find('td').each(function(index,data) {
       if ($(this).css('display') != 'none'){ 
        if(defaults.ignoreColumn.indexOf(index) == -1){
         xml += "<column-"+colCount+">"+parseString($(this))+"</column-"+colCount+">";
        }
       }
       colCount++;
      });               
      rowCount++;
      xml += '</row>';
     });     
     xml += '</data></tabledata>'
      
     if(defaults.consoleLog == 'true'){
      console.log(xml);
     }
      
     var base64data = "base64," + $.base64.encode(xml);
     window.open('data:application/xml;filename=exportData;' + base64data);
    }else if(defaults.type == 'excel' || defaults.type == 'doc'|| defaults.type == 'powerpoint'  ){
     //console.log($(this).html());
     var excel="<table>";
     // Header
     $(el).find('thead').find('tr').each(function() {
      excel += "<tr>";
      $(this).filter(':visible').find('th').each(function(index,data) {
       if ($(this).css('display') != 'none'){     
        if(defaults.ignoreColumn.indexOf(index) == -1){
         excel += "<td>" + parseString($(this))+ "</td>";
        }
       }
      }); 
      excel += '</tr>';      
       
     });     
      
      
     // Row Vs Column
     var rowCount=1;
     $(el).find('tbody').find('tr').each(function() {
      excel += "<tr>";
      var colCount=0;
      $(this).filter(':visible').find('td').each(function(index,data) {
       if ($(this).css('display') != 'none'){ 
        if(defaults.ignoreColumn.indexOf(index) == -1){
         excel += "<td>"+parseString($(this))+"</td>";
        }
       }
       colCount++;
      });               
      rowCount++;
      excel += '</tr>';
     });     
     excel += '</table>'
      
     if(defaults.consoleLog == 'true'){
      console.log(excel);
     }
      
     var excelFile = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:"+defaults.type+"' xmlns='http://www.w3.org/TR/REC-html40'>";
     excelFile += "<head>";
     excelFile += "<!--[if gte mso 9]>";
     excelFile += "<xml>";
     excelFile += "<x:ExcelWorkbook>";
     excelFile += "<x:ExcelWorksheets>";
     excelFile += "<x:ExcelWorksheet>";
     excelFile += "<x:Name>";
     excelFile += "{worksheet}";
     excelFile += "</x:Name>";
     excelFile += "<x:WorksheetOptions>";
     excelFile += "<x:DisplayGridlines/>";
     excelFile += "</x:WorksheetOptions>";
     excelFile += "</x:ExcelWorksheet>";
     excelFile += "</x:ExcelWorksheets>";
     excelFile += "</x:ExcelWorkbook>";
     excelFile += "</xml>";
     excelFile += "<![endif]-->";
     excelFile += "</head>";
     excelFile += "<body>";
     excelFile += excel;
     excelFile += "</body>";
     excelFile += "</html>";
     var base64data = "base64," + $.base64({ data: excelFile, type: 0 });
     window.open('data:application/vnd.ms-'+defaults.type+';filename=exportData.doc;' + base64data);
      
    }else if(defaults.type == 'png'){
     html2canvas($(el), {
      onrendered: function(canvas) {          
       var img = canvas.toDataURL("image/png");
       window.open(img);
        
        
      }
     });  
    }else if(defaults.type == 'pdf'){
  
     var doc = new jsPDF('p','pt', 'a4', true);
     doc.setFontSize(defaults.pdfFontSize);
      
     // Header
     var startColPosition=defaults.pdfLeftMargin;
     $(el).find('thead').find('tr').each(function() {
      $(this).filter(':visible').find('th').each(function(index,data) {
       if ($(this).css('display') != 'none'){     
        if(defaults.ignoreColumn.indexOf(index) == -1){
         var colPosition = startColPosition+ (index * 50);         
         doc.text(colPosition,20, parseString($(this)));
        }
       }
      });         
     });     
     
     
     // Row Vs Column
     var startRowPosition = 20; var page =1;var rowPosition=0;
     $(el).find('tbody').find('tr').each(function(index,data) {
      rowCalc = index+1;
       
     if (rowCalc % 26 == 0){
      doc.addPage();
      page++;
      startRowPosition=startRowPosition+10;
     }
     rowPosition=(startRowPosition + (rowCalc * 10)) - ((page -1) * 280);
       
      $(this).filter(':visible').find('td').each(function(index,data) {
       if ($(this).css('display') != 'none'){ 
        if(defaults.ignoreColumn.indexOf(index) == -1){
         var colPosition = startColPosition+ (index * 50);         
         doc.text(colPosition,rowPosition, parseString($(this)));
        }
       }
        
      });               
       
     });     
           
     // Output as Data URI
     doc.output('datauri');
  
    }
     
     
    function parseString(data){
     
     if(defaults.htmlContent == 'true'){
      content_data = data.html().trim();
     }else{
      content_data = data.text().trim();
     }
      
     if(defaults.escape == 'true'){
      content_data = escape(content_data);
     }
      
      
      
     return content_data;
    }
    
   }
        });
    })(jQuery);